Testovani Terminated

Otázka od: Jiri Foldyna

22. 11. 2002 13:59

Ahoj,

muze konstrukce

procedure TImportThread.Execute;
...
  while not(Terminated) do
    ProcessData(@Terminated);
  end;
...

procedure ProcessData(Terminated : ^boolean);
...
  while not(Terminated^) do
  ...
  end;
...

zpusobit nejake problemy ? Na stole to funguje, ale potrebuji to mit na DB
serveru 7x24...

Potrebuji co nejrychleji zpracovat promenlive mnozstvi vstupnich dat a
soucasne potrebuji mit moznost rychle ukoncit aplikaci (je to sluzba -
reakce na shutdown), kvuli rezii vytvareni datovych objektu nechci opoustet
proceduru ProcessData, driv nez je vsechno hotovo (jen pripade ukonceni
threadu). Procedura je pouzivana jedinym vlaknem.

Diky za nazory.

Zdravim

Jiri Foldyna
mailto:jiri.f@avizo.cz

Odpovedá: Jan Sebelík

23. 11. 2002 20:36

> Odesílatel: Jiri Foldyna <jiri.f@avizo.cz>
> muze konstrukce
> zpusobit nejake problemy ? Na stole to funguje, ale potrebuji to mit na DB
> serveru 7x24...

Nevim, nevim, ale me se to vnorene "while" zda zbytecne.
Pokud by "ProcessData" (bez parametru) proste provedlo totez, co to vnitrni
"while", tak to snad vyjde na stejno.
Navic "Terminated" je property a pointer na property ??? Odkud vim, ze tam neni
nejaka "read property" funkce? Samozřejmě, ze zdrojaku, ale preci jenom...

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
> procedure TImportThread.Execute;
> ...
> while not(Terminated) do
> ProcessData(@Terminated);
> end;
> ...
>
> procedure ProcessData(Terminated : ^boolean);
> ...
> while not(Terminated^) do
> ...
> end;
> ...
>
>
> Potrebuji co nejrychleji zpracovat promenlive mnozstvi vstupnich dat a
> soucasne potrebuji mit moznost rychle ukoncit aplikaci (je to sluzba -
> reakce na shutdown), kvuli rezii vytvareni datovych objektu nechci opoustet
> proceduru ProcessData, driv nez je vsechno hotovo (jen pripade ukonceni
> threadu). Procedura je pouzivana jedinym vlaknem.
>
> Diky za nazory.
>
> Zdravim
>
> Jiri Foldyna
> mailto:jiri.f@avizo.cz
>

Odpovedá: Jiri Foldyna

23. 11. 2002 18:37

> Nevim, nevim, ale me se to vnorene "while" zda zbytecne.
> Pokud by "ProcessData" (bez parametru) proste provedlo totez,
> co to vnitrni "while", tak to snad vyjde na stejno.
> Navic "Terminated" je property a pointer na property ???
> Odkud vim, ze tam neni nejaka "read property" funkce?
> Samozřejmě, ze zdrojaku, ale preci jenom...
> Honza

No, ja samozrejme vim, ze je to humus  , ale jde o to, ze procedura
ProcessData zpracovava data ze SQL serveru ze vstupni fronty (tabulka) a
potrebuje je setridene. Jde o technologickou zalezitost (mereni), kde jsou
tvrde pozadavky na odezvu. Data do vstupni fronty mohou prichazet v pomerne
velkych davkach (i desetitisice udaju), takze setridovani je casove dost
narocne. Kdybych tam nechal jen ten vnejsi while, snadno se mi muze stat, ze
prosvihnu odezvu na signal shutdown, coz by mohlo vest ke ztrate konzistence
importovanych dat. Cili jsou zde dva protichudne pozadavky - na jedno
setrideni zpracovat celou vstupni frontu a soucasne zarucit primerenou
odezvu na shutdown. Jiste by to slo udelat treba pres event, ale pokud
testovani Terminated neni nic proti nicemu...
Ted mne napadlo, ja prece muzu predat misto adresy Terminated odkaz na
instanci threadu, a testovat to jako properties, ne ? Asi takto:

procedure TImportThread.Execute;
...
   while not(Terminated) do
     ProcessData(Self);
   end;
 ...

procedure ProcessData(Thread : TThread);
 ...
   while not(Thread.Terminated) do
   ...
   end;
 ...

To je ciste, ne ?

Zdravim

Jiri Foldyna
mailto:jiri.f@avizo.cz

Odpovedá: Petr Vones

27. 11. 2002 23:55

From: "Jiri Foldyna" <jiri.f@avizo.cz>
> Ted mne napadlo, ja prece muzu predat misto adresy Terminated odkaz na
> instanci threadu, a testovat to jako properties, ne ? Asi takto:
>
> procedure TImportThread.Execute;
> ...
> while not(Terminated) do
> ProcessData(Self);
> end;
> ...
>
> procedure ProcessData(Thread : TThread);
> ...
> while not(Thread.Terminated) do
> ...
> end;
> ...


A co udelat z procedury ProcessData metodu te tridy TImportThread ?

Petr Vones

Odpovedá: Jiri Foldyna

28. 11. 2002 0:05

To by samozrejme slo, ale jak uz jsem psal, je to soucast service, presneji
receno jeji klicova rutina a potreboval jsem ji odladit - nastartovat
service s debuggerem se mi nejak nepodarilo (viz muj dotaz par tydnu
zpatky), takze jsem ji ladil provizornim volanim (jeden button na jinak
prazdnem formulari  . No, uz je to vyresene, i kdyz pravda, Terminated je
protected property, takze jsem si ji musel publikovat v pomocne tride  .
Ale funguje to spolehlive.

> > Ted mne napadlo, ja prece muzu predat misto adresy
> Terminated odkaz na
> > instanci threadu, a testovat to jako properties, ne ? Asi takto:
>
> A co udelat z procedury ProcessData metodu te tridy TImportThread ?
>
> Petr Vones